﻿#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,,9,10 };
//}

////用for循环遍历数组寻找我想要的元素
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    //            0 1 2 3 4 5 6 7 8 9
//    int k = 0;
//    scanf("%d", &k);//7
//    int i = 0;
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int find = 0;//假设找不到
//    for (i = 0; i < sz; i++)
//    {
//        if (k == arr[i])
//        {
//            printf("找到了,下标是%d\n,i");
//            find = 1;
//            break;
//        }
//     }
//    if (find == 0)
//    {
//        printf("找不到\n");
//    }
//    return 0;
//}


//有序数组--二分查找（折半查找）--注意是有序的
//1，2，3，4，5，6，7，8，9，10
//0  1  2  3  4  5  6  7  8   9
//L           mid             R
//mid=（L+R）/2=（0+9）/2=4
                  //(5+9)/2=7
                  //(5 + 6) / 2 = 5
                  //(6+6)/2=6
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    int k = 0;
//    int sz=sizeof(arr)/sizeof
//        (arr)
//}

//#include <stdio.h>
//
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    int k = 0;
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    scanf("%d", &k);
//    //查找-二分查找
//    int left = 0;
//    int right = sz-1;//元素的下标
//    int find = 0;//假设找不到
//    
//    while (left <= right)
//    {
//        int mid = (left + right) / 2;
//        if (arr[mid] < k)
//        {
//            left = mid + 1;
//        }
//        else if (arr[mid] > k)
//        {
//            right = mid - 1;
//        }
//        else
//        {
//            printf("找到了,下标是%d\n", mid);
//            find = 1;
//            break;
//        }
//    }
//    if (find == 0)
//    {
//        printf("找不到了\n");
//    }
//    return 0;
//}

//#include<limits.h>
//#include<stdio.h>
//
//int main()
//{
//    //INT_MAX;
//    int left = 2147483646;
//    int right = 2147483646;
//
//    int mid = left + (left - right) / 2;相当于互补,将left和right差值的一半加到left上去
// 求中间元素的下标，使⽤ mid = (left+right)/2 ，如果left和right⽐较⼤的时候可能存在问题，可以使⽤下⾯的⽅式：mid = left + (right - left) / 2;
//    printf("%d\n",mid );
//    return 0;
//
////}
//
////函数
////完成某项特定任务的小段代码
////1.库函数:形成的函数, 直接可以使用, 使用时要进行头文件声明----下面是数学库里面的开方的使用
//#include <stdio.h>
//#include <math.h>
//int main()
//{
//    double d = 16.0;
//    double r = sqrt(d);
//    printf("%lf\n", r);
//    return 0;
//}
//2自定义函数
//#include <math.h>
//#include<stdio.h>
//int Add(int x, int y)//形式上的参数,简称形参
////ret_type --就是这里的Add前面的int是⽤来表⽰函数计算结果的类型，有时候返回类型可以是 void ，表⽰什么都不返回
////fun_name --就是Add是为了⽅便使⽤函数；就像⼈的名字⼀样，有了名字⽅便称呼，函数有了名字⽅便调⽤，所以函数名尽量要根据函数的功能起的有意义。
////函数的参数就相当于，⼯⼚中送进去的原材料，函数的参数也可以是 void ，明确表⽰函数没有参数。如果有参数，要交代清楚参数的类型和名字，以及参数个数。
//{
//    return x + y;
//    //在这个函数中，变量z存储了变量x和y的和，并通过return 语将结果返回给调用方。return z的作用是将z的值作为函数的结果返回。
//    //调用 Add 函数时，可以通过接收返回值的变量来获取计算结果
//}
////{}括起来的部分被称为函数体，函数体就是完成计算的过程。
//// 
////(2)形参实际化
//
////(1)先写出这个函数应用场景
//int main( )
//{
//    int a = 0;
//    int b = 0;
//    //输入
//    scanf_s("%d %d", &a, &b);
//    //计算求和
//    int z=Add(a, b);//a和b是真实传给Add的参数,是实际参数,简称实参
//    //输出
//    printf("%d\n", z);
//    return 0;
//}


//#include <stdio.h>
//void test()
//{
//    int n = 0;
//    scanf("%d", &n);
//    printf("hehe\n");
//    if (n == 5)
//        return ;//直接跳出返回空值void
//    printf("haha\n");
//}
//
//int main()
//{
//    test();
//    return 0;
//}
//
//#include <stdio.h>
//void test()
//{
//    int i = 0;
//    for (i = 0; i < 10; i++)
//    {
//        if (i == 5)
//            break;
//        printf("hehe\n");
//    }
//    //
//    printf("haha\n");
//}
// 
//int main()
//{
//    test();
//    return 0;
//}

//int test()
//{
//    return 3.14;
//}
//
//int main()
//{
//    int n = test();
//    printf("%d\n", n);
//
//    return 0;
//}


//#include <stdio.h>
//int test()
//{
//    int n = 1;
//    if (n == 5)
//        return 1;
//
//}
//
//int main()
//{
//    int m = test();
//    printf("%d\n", m);
//    return 0;
//}

//#include <stdio.h>
//int test()
//{
//    int n = 1;
//    if (n == 5)
//        return 1;
//    else
//        return -1;
//
//}
//
//int main()
//{
//    int m = test();
//    printf("%d\n", m);
//    return 0;
//}

////写⼀个函数对将⼀个整型数组的内容，全部置为-1，再写⼀个函数打印数组的内容。
//#include<stdio.h>
//void set_arr(int arr[], int sz)
//{
//  int i = 0;
//  for (i = 0; i < sz; i++)
//     {
//      arr[i] = -1;
//     }
//}
//
//void print_arr(int arr[], int sz)
//{
//    int i = 0;
//    for (i = 0; i < sz; i++)
//    {
//        printf("%d", arr[i]);
//    }
//    printf("\n");
//}
//int main()
//{
//    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//    int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组元素个数才能遍历
//    print_arr(arr, sz);//先打印出原来的元素
//    //先写一个函数,将arr中的内容全部设为-1
//    set_arr(arr,sz);
//    //写一个函数,将arr中的内容打印出来
//    print_arr(arr,sz);
//    return 0;
//}

////二维数组传参
//#include <stdio.h>
//void print_arr(int arr[][5], int r, int c)
//{
//    int i = 0;
//    for (i = 0; i < r; i++)
//    {
//        int j = 0;
//        for (j = 0; j < c; j++)
//        {
//            printf("%d ", arr[i][j]);
//        }
//        printf("\n");
//
//    }
//
//}
//
//int main()
//{
//    int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
//    print_arr(arr, 3, 5);
//    return 0;
//}

////嵌套调用
////例子:假设我们计算某年某⽉有多少天？，如果要函数实现，可以设计2个函数:
////is_leap_year()：根据年份确定是否是闰年
////get_days_of_month()：调⽤is_leap_year确定是否是闰年后，再根据⽉计算这个⽉的天数
//#include <stdio.h>
////(3)进一步细化判断是否为闰年
//int is_leap_year(int y)
//{
//    if (y %400 == 0 ||( y % 100 != 0 && y %4 == 0))
//        return 1;
//    
//    else
//        return 0;
//}
//
////(2)通过函数封装进行模块的细化
//int get_days_of_month(int y, int m)
//{
//    //巧妙利用数组进行12个月天数的输入,将月份和它对应的天数对齐
//    int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//        //         0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12
//    int d = days[m];//通过月份访问天数
//    if(is_leap_year(y) && m==2)//判断是否为闰年并且是否为二月
//    {
//        d += 1;
//    }
//    return d;
//}
//
//
////(1)根据题目含义先写出大概模块
//int main()
//{
//    int y = 0;//年
//    int m = 0;//月
//    scanf("%d %d", &y, &m);//输入年月
//    int d=get_days_of_month(y,m);//天数
//    printf("%d", d);//打印天数
//    return 0;
//
//}

//将⼀个函数的返回值作为另外⼀个函数的参数，像链条⼀样将函数串起来就是函数的链式访问。
#include <stdio.h>
int main()
{
    int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度
    printf("%d\n", len);//2.打印⻓度 
    return 0;
}

#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));//链式访问
    return 0;
}
//把strlen的返回值直接作为printf函数的参数, 这样就是⼀ 个链式访问


#include <stdio.h>
int main()
{
   printf("%d", printf("%d", printf("%d", 43)));
   return 0;
}
//根据c语言官网printf函数返回值可知它返回的是打印在屏幕上字符的个数
//上⾯的例⼦中，我们就第⼀个printf打印的是第⼆个printf的返回值，第⼆个printf打印的是第三个
//printf的返回值。
//第三个printf打印43，在屏幕上打印2个字符，再返回2
//第⼆个printf打印2，在屏幕上打印1个字符，再放回1
//第⼀个printf打印1
//所以屏幕上最终打印：4321